home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / doom / quake.zip / PUNISH.ZIP / WEAPONS.QC < prev   
Text File  |  1996-08-12  |  40KB  |  1,743 lines

  1. /*
  2. ==========================================================
  3. SplitMissile v1.01
  4. Tracer v1.0
  5. by Punisher
  6. email: punisher@trojan.neta.com
  7.  
  8. Auto Shotgun v1.0
  9. by Biafra with supervision from Punisher
  10.  
  11. Bouncing Fragmentation Grenade!    7/28/96 by Steve Bond
  12. Email: wedge@nuc.net    WWW: http://www.nuc.net/quake
  13. improved by Punisher
  14. ==========================================================
  15. */
  16. void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
  17. void () player_run;
  18. void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
  19. void(vector org, vector vel, float damage) SpawnBlood;
  20. void() SuperDamageSound;
  21.  
  22.  
  23. // called by worldspawn
  24. void() W_Precache =
  25. {
  26.         precache_model ("progs/laser.mdl");     //for tracer
  27.         precache_sound ("weapons/r_exp3.wav");  // new rocket explosion
  28.     precache_sound ("weapons/rocket1i.wav");        // spike gun
  29.     precache_sound ("weapons/sgun1.wav");
  30.     precache_sound ("weapons/guncock.wav"); // player shotgun
  31.     precache_sound ("weapons/ric1.wav");    // ricochet (used in c code)
  32.     precache_sound ("weapons/ric2.wav");    // ricochet (used in c code)
  33.     precache_sound ("weapons/ric3.wav");    // ricochet (used in c code)
  34.     precache_sound ("weapons/spike2.wav");  // super spikes
  35.     precache_sound ("weapons/tink1.wav");   // spikes tink (used in c code)
  36.     precache_sound ("weapons/grenade.wav"); // grenade launcher
  37.     precache_sound ("weapons/bounce.wav");          // grenade bounce
  38.     precache_sound ("weapons/shotgn2.wav"); // super shotgun
  39. };
  40.  
  41. float() crandom =
  42. {
  43.     return 2*(random() - 0.5);
  44. };
  45.  
  46. /*
  47. ================
  48. W_FireAxe
  49. ================
  50. */
  51. void() W_FireAxe =
  52. {
  53.     local   vector  source;
  54.     local   vector  org;
  55.  
  56.     source = self.origin + '0 0 16';
  57.     traceline (source, source + v_forward*64, FALSE, self);
  58.     if (trace_fraction == 1.0)
  59.         return;
  60.     
  61.     org = trace_endpos - v_forward*4;
  62.  
  63.     if (trace_ent.takedamage)
  64.     {
  65.         trace_ent.axhitme = 1;
  66.         SpawnBlood (org, '0 0 0', 20);
  67.         T_Damage (trace_ent, self, self, 20);
  68.     }
  69.     else
  70.     {       // hit wall
  71.         sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
  72.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  73.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  74.         WriteCoord (MSG_BROADCAST, org_x);
  75.         WriteCoord (MSG_BROADCAST, org_y);
  76.         WriteCoord (MSG_BROADCAST, org_z);
  77.     }
  78. };
  79.  
  80.  
  81. //============================================================================
  82.  
  83.  
  84. vector() wall_velocity =
  85. {
  86.     local vector    vel;
  87.     
  88.     vel = normalize (self.velocity);
  89.     vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
  90.     vel = vel + 2*trace_plane_normal;
  91.     vel = vel * 200;
  92.     
  93.     return vel;
  94. };
  95.  
  96.  
  97. /*
  98. ================
  99. SpawnMeatSpray
  100. ================
  101. */
  102. void(vector org, vector vel) SpawnMeatSpray =
  103. {
  104.     local   entity missile, mpuff;
  105.     local   vector  org;
  106.  
  107.     missile = spawn ();
  108.     missile.owner = self;
  109.     missile.movetype = MOVETYPE_BOUNCE;
  110.     missile.solid = SOLID_NOT;
  111.  
  112.     makevectors (self.angles);
  113.  
  114.     missile.velocity = vel;
  115.     missile.velocity_z = missile.velocity_z + 250 + 50*random();
  116.  
  117.     missile.avelocity = '3000 1000 2000';
  118.     
  119. // set missile duration
  120.     missile.nextthink = time + 1;
  121.     missile.think = SUB_Remove;
  122.  
  123.     setmodel (missile, "progs/zom_gib.mdl");
  124.     setsize (missile, '0 0 0', '0 0 0');            
  125.     setorigin (missile, org);
  126. };
  127.  
  128. /*
  129. ================
  130. SpawnBlood
  131. ================
  132. */
  133. void(vector org, vector vel, float damage) SpawnBlood =
  134. {
  135.     particle (org, vel*0.1, 73, damage*2);
  136. };
  137.  
  138. /*
  139. ================
  140. spawn_touchblood
  141. ================
  142. */
  143. void(float damage) spawn_touchblood =
  144. {
  145.     local vector    vel;
  146.  
  147.     vel = wall_velocity () * 0.2;
  148.     SpawnBlood (self.origin + vel*0.01, vel, damage);
  149. };
  150.  
  151.  
  152. /*
  153. ================
  154. SpawnChunk
  155. ================
  156. */
  157. void(vector org, vector vel) SpawnChunk =
  158. {
  159.     particle (org, vel*0.02, 0, 10);
  160. };
  161.  
  162. /*
  163. ==============================================================================
  164.  
  165. MULTI-DAMAGE
  166.  
  167. Collects multiple small damages into a single damage
  168.  
  169. ==============================================================================
  170. */
  171.  
  172. entity  multi_ent;
  173. float   multi_damage;
  174.  
  175. void() ClearMultiDamage =
  176. {
  177.     multi_ent = world;
  178.     multi_damage = 0;
  179. };
  180.  
  181. void() ApplyMultiDamage =
  182. {
  183.     if (!multi_ent)
  184.         return;
  185.     T_Damage (multi_ent, self, self, multi_damage);
  186. };
  187.  
  188. void(entity hit, float damage) AddMultiDamage =
  189. {
  190.     if (!hit)
  191.         return;
  192.     
  193.     if (hit != multi_ent)
  194.     {
  195.         ApplyMultiDamage ();
  196.         multi_damage = damage;
  197.         multi_ent = hit;
  198.     }
  199.     else
  200.         multi_damage = multi_damage + damage;
  201. };
  202.  
  203. /*
  204. ==============================================================================
  205.  
  206. BULLETS
  207.  
  208. ==============================================================================
  209. */
  210.  
  211. /*
  212. ================
  213. TraceAttack
  214. ================
  215. */
  216. void(float damage, vector dir) TraceAttack =
  217. {
  218.     local   vector  vel, org;
  219.     
  220.     vel = normalize(dir + v_up*crandom() + v_right*crandom());
  221.     vel = vel + 2*trace_plane_normal;
  222.     vel = vel * 200;
  223.  
  224.     org = trace_endpos - dir*4;
  225.  
  226.     if (trace_ent.takedamage)
  227.     {
  228.         SpawnBlood (org, vel*0.2, damage);
  229.         AddMultiDamage (trace_ent, damage);
  230.     }
  231.     else
  232.     {
  233.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  234.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  235.         WriteCoord (MSG_BROADCAST, org_x);
  236.         WriteCoord (MSG_BROADCAST, org_y);
  237.         WriteCoord (MSG_BROADCAST, org_z);
  238.     }
  239. };
  240.  
  241. /*
  242. ================
  243. FireBullets
  244.  
  245. Used by shotgun, super shotgun, and enemy soldier firing
  246. Go to the trouble of combining multiple pellets into a single damage call.
  247. ================
  248. */
  249. void(float shotcount, vector dir, vector spread) FireBullets =
  250. {
  251.     local   vector direction;
  252.     local   vector  src;
  253.     
  254.     makevectors(self.v_angle);
  255.  
  256.     src = self.origin + v_forward*10;
  257.     src_z = self.absmin_z + self.size_z * 0.7;
  258.  
  259.     ClearMultiDamage ();
  260.     while (shotcount > 0)
  261.     {
  262.         direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
  263.  
  264.         traceline (src, src + direction*2048, FALSE, self);
  265.         if (trace_fraction != 1.0)
  266.             TraceAttack (4, direction);
  267.  
  268.         shotcount = shotcount - 1;
  269.     }
  270.     ApplyMultiDamage ();
  271. };
  272.  
  273. /*
  274. ================
  275. W_FireShotgun
  276. ================
  277. */
  278. void() W_FireShotgun =
  279. {
  280.     local vector dir;
  281.  
  282.     sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM); 
  283.  
  284.     self.punchangle_x = -2;
  285.     
  286.     self.currentammo = self.ammo_shells = self.ammo_shells - 1;
  287.     dir = aim (self, 100000);
  288.     FireBullets (6, dir, '0.04 0.04 0');
  289. };
  290.  
  291.  
  292. /*
  293. ================
  294. W_FireSuperShotgun
  295. ================
  296. */
  297. void() W_FireSuperShotgun =
  298. {
  299.     local vector dir;
  300.  
  301.     if (self.currentammo == 1)
  302.     {
  303.         W_FireShotgun ();
  304.         return;
  305.     }
  306.         
  307.     sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM); 
  308.  
  309.     self.punchangle_x = -4;
  310.     
  311.     self.currentammo = self.ammo_shells = self.ammo_shells - 2;
  312.     dir = aim (self, 100000);
  313.     FireBullets (14, dir, '0.14 0.08 0');
  314. };
  315.  
  316.  
  317. /*
  318. ==============================================================================
  319.  
  320. ROCKETS
  321.  
  322. ==============================================================================
  323. */
  324.  
  325. void()  s_explode1      =       [0,             s_explode2] {};
  326. void()  s_explode2      =       [1,             s_explode3] {};
  327. void()  s_explode3      =       [2,             s_explode4] {};
  328. void()  s_explode4      =       [3,             s_explode5] {};
  329. void()  s_explode5      =       [4,             s_explode6] {};
  330. void()  s_explode6      =       [5,             SUB_Remove] {};
  331.  
  332. void() BecomeExplosion =
  333. {
  334.     self.movetype = MOVETYPE_NONE;
  335.     self.velocity = '0 0 0';
  336.     self.touch = SUB_Null;
  337.     setmodel (self, "progs/s_explod.spr");
  338.     self.solid = SOLID_NOT;
  339.     s_explode1 ();
  340. };
  341.  
  342. void() T_MissileTouch =
  343. {
  344.     local float     damg;
  345.  
  346.     if (other == self.owner)
  347.         return;         // don't explode on owner
  348.  
  349.     if (pointcontents(self.origin) == CONTENT_SKY)
  350.     {
  351.         remove(self);
  352.         return;
  353.     }
  354.  
  355.     damg = 100 + random()*20;
  356.     
  357.     if (other.health)
  358.     {
  359.         if (other.classname == "monster_shambler")
  360.             damg = damg * 0.5;      // mostly immune
  361.         T_Damage (other, self, self.owner, damg );
  362.     }
  363.  
  364.     // don't do radius damage to the other, because all the damage
  365.     // was done in the impa